package com.sz.virtualbank.dao.mapper;

import com.sz.virtualbank.dao.entity.Notification;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 通知消息Mapper接口
 * 
 * @author Claude
 */
@Mapper
public interface NotificationMapper {
    
    /**
     * 新增通知消息
     *
     * @param notification 通知消息
     * @return 影响行数
     */
    int insert(Notification notification);
    
    /**
     * 更新通知消息
     *
     * @param notification 通知消息
     * @return 影响行数
     */
    int update(Notification notification);
    
    /**
     * 根据ID查询通知消息
     *
     * @param id 消息ID
     * @return 通知消息
     */
    Notification selectById(Long id);
    
    /**
     * 查询用户的通知消息列表
     *
     * @param userId 用户ID
     * @param type 消息类型（可选）
     * @param status 消息状态（可选）
     * @param offset 偏移量
     * @param limit 每页条数
     * @return 通知消息列表
     */
    List<Notification> selectByUserId(@Param("userId") Long userId, 
                                     @Param("type") Integer type,
                                     @Param("status") Integer status,
                                     @Param("offset") Integer offset, 
                                     @Param("limit") Integer limit);
    
    /**
     * 统计用户的通知消息数量
     *
     * @param userId 用户ID
     * @param type 消息类型（可选）
     * @param status 消息状态（可选）
     * @return 记录数量
     */
    int countByUserId(@Param("userId") Long userId, 
                      @Param("type") Integer type,
                      @Param("status") Integer status);
    
    /**
     * 标记消息为已读
     *
     * @param id 消息ID
     * @param userId 用户ID
     * @return 影响行数
     */
    int markAsRead(@Param("id") Long id, @Param("userId") Long userId);
    
    /**
     * 标记所有消息为已读
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    int markAllAsRead(Long userId);
    
    /**
     * 删除消息
     *
     * @param id 消息ID
     * @param userId 用户ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Long id, @Param("userId") Long userId);
    
    /**
     * 查询用户未读消息数量
     *
     * @param userId 用户ID
     * @return 未读消息数量
     */
    int countUnread(Long userId);
}
